package com.itx.gatewayx.task;

import com.itx.gatewayx.domain.News;
import com.itx.gatewayx.domain.dto.NewsApiResponse;
import com.itx.gatewayx.service.NewsService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * 新闻数据抓取定时任务
 *
 * @author itx
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class NewsTask {

    /**
     * 新闻分类列表
     */
    private static final List<String> CATEGORIES = Arrays.asList(
            "top", "guonei", "guoji", "yule", "tiyu", "junshi", 
            "keji", "caijing", "youxi", "qiche", "jiankang");
    
    private final NewsService newsService;
    private final Random random = new Random();
    
    /**
     * 获取随机的新闻类型
     */
    private String getRandomCategory() {
        int index = random.nextInt(CATEGORIES.size());
        return CATEGORIES.get(index);
    }
    
    /**
     * 获取随机的页码（1-10之间）
     */
    private int getRandomPage() {
        return random.nextInt(10) + 1;
    }
    
    /**
     * 获取随机的页大小（10-30之间）
     */
    private int getRandomPageSize() {
        return 30; // 10到30之间
    }
    
    /**
     * 每10秒执行一次新闻抓取任务
     */

    @Scheduled(cron = "0 */10 * * * ?") // 改成每10秒执行一次
    public void fetchNewsTask() {
        log.info("开始执行新闻数据抓取任务");
        
        try {
            // 随机获取一个新闻类型
            String category = getRandomCategory();
            // 随机获取页码和每页大小
            int page = getRandomPage();
            int pageSize = getRandomPageSize();
            
            // 构建请求参数
            Map<String, String> params = new HashMap<>();
            params.put("type", category);
            params.put("page", String.valueOf(page));
            params.put("page_size", String.valueOf(pageSize));
            params.put("is_filter", "1"); // 只返回有内容详情的新闻
            
            log.info("获取新闻参数 - 类型: {}, 页码: {}, 每页数量: {}", category, page, pageSize);
            
            // 调用API获取新闻数据
            NewsApiResponse response = newsService.fetchNewsFromApi(params);
            if (response != null && response.getErrorCode() == null) {
                // 转换为新闻实体对象
                List<News> newsList = newsService.convertFromApiResponse(response);
                
                // 保存新闻数据
                newsService.saveNewsList(newsList);
                
                log.info("成功获取 [{}] 类型新闻 {} 条", category, newsList.size());
            } else {
                log.warn("获取 [{}] 类型新闻失败: {}", category, 
                        response == null ? "响应为空" : response.getReason());
            }
        } catch (Exception e) {
            log.error("获取新闻数据异常", e);
        }
        
        log.info("新闻数据抓取任务执行完成");
    }
    

    /**
     * 手动触发新闻拉取（可用于测试或初始化）
     */
    public void manualFetchNews() {
        fetchNewsTask();
    }
    
    /**
     * 手动触发全量新闻拉取（测试用）
     */
    public void manualFetchAllNews() {
        //fetchAllCategoriesNewsTask();
    }
} 